【X68000(Z)アセンブラ講座 第008回 : スプライト画像の表示@】 2025/01/24   今回はゲーム製作で役立ち活躍してくれるスプライト機能について説明します。 X68000のグラフィック機能はとても優秀なので X68000をゲーセン基板の代わりにしてゲームを制作して X68000をゲーセンの筐体の中に入れて稼働していたという話も聞いた事があります。 その中でもX68000のスプライトはアーケード並みらしいです。 早速本題に入ります!! 破線の内側を'SP_SAMP.s'と言うファイル名で保存して下さい。 ------------------------------------------------------------------------------------------------ ******************************************************************************** * * アプリ名 : SP_SAMP.x * * スプライト表示のサンプル * * Ver1.00 * ******************************************************************************** * スプライトパレット0から15のうちパレット0はテキストパレットと共用。 include A:\XC\INCLUDE\DOSCALL.MAC * OSコール用マクロの読み込み include A:\XC\INCLUDE\IOCSCALL.MAC * IOCS(BIOS)コール用マクロの読み込み * システム領域のアドレス cg_palette equ $E82000 * CG用パレットデータの先頭アドレス cg_buffer equ $C00000 * CG-VRAMの先頭アドレス cg_scroll_x equ $E80018 * CGスクロール X cg_scroll_y equ $E8001a * CGスクロール Y sp_palette equ $E82200 * スプライト用パレットデータの先頭アドレス sp_pattern equ $EB8000 * スプライトパターンデータの先頭アドレス sp_controll equ $EB0000 * スプライトレジスターの先頭アドレス .cpu 68000 * CPUのタイプ .data * '.data'以降のデータはデータセクションに配置される sp00: dc.b $ff,$ff,$ff,$ff dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $f1,$11,$11,$11 dc.b $ff,$ff,$ff,$ff dc.b $ff,$ff,$ff,$ff dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $11,$11,$11,$1f dc.b $ff,$ff,$ff,$ff sppal01: * GGGGG RRRRR BBBBB A dc.w %00000_00000_00000_0 dc.w %00000_00000_11111_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %00000_00000_00000_0 dc.w %11111_11111_11111_0 .bss * '.bss'以降データバッファ .text * '.text'以降のプログラムはテキストセクションに配置される start: * スタートアドレス * ユーザーモードからスーパーバイザーモードに移行する moveq.l #_B_SUPER,d0 * d0にIOCS(BIOS)機能番号を代入 move.l #0,d1 * 数値0をd1に代入 movea.l d1,a1 * d1をa1にコピー trap #15 * IOCSコール実行 * 画面モードの設定 moveq.l #_CRTMOD,d0 * 画面モードの設定 move.w #10,d1 * 画面モードの番号 : 16 = 768x512x4bit / 10 = 256x256x8bit trap #15 * 画面をクリアして表示をオンにする moveq.l #_G_CLR_ON,d0 * 画面をクリアして表示をオンにする trap #15 * スプライト表示をオンにする moveq.l #_SP_ON,d0 trap #15 moveq.l #1,d0 * 設定するパレット番号をd0に代入 lea sppal01,a0 bsr set_palette * スプライトパレット設定ルーチンの呼び出し moveq.l #1,d0 * スプライトパターン番号をd0に代入 lea sp00,a0 bsr set_sprite * スプライトパターンデータの定義 * スプライトの表示 moveq.l #0,d0 * 表示するスプライト番号(0 - 127) move.w #16+128-8,d1 * スプライトX座標(0 - 1023) move.w #16+128-8,d2 * スプライトY座標(0 - 1023) move.w #$0101,d3 * スプライト情報 move.w #3,d4 * プライオリティ bsr put_sprite * スプライト表示ルーチンの呼び出す * スーパーバイザーモードからユーザーモードに戻る moveq.l #_B_SUPER,d0 move.l SP,a1 trap #15 * アプリ終了 dc.w _EXIT * OSコール実行 : _EXIT = プログラムの終了 * Set Sprite Palette set_palette: * in d0.l = 定義するスプライトパレット番号 * in a0.l = パレットデータのアドレス movem.l d0/a0/a1,-(sp) movea.l #sp_palette,a1 * スプライトパレットレジスターのアドレス lsl.l #5,d0 * d0の値を32倍にする adda.l d0,a1 moveq.l #0,d0 set_palette_1: move.w (a0)+,(a1)+ addq.w #1,d0 * 色番号を次の番号に更新する cmp.w #16,d0 * 現在の色番号と16を比較する blt set_palette_1 * 現在の色番号が16未満ならアドレスset_palette_1に飛ぶ movem.l (sp)+,d0/a0/a1 rts * 呼出元に戻る * スプライトパターンの定義 set_sprite: * in d0.l = 定義するスプライトパターンの番号(1 - 255) * in a0.l = 定義するスプライトパターンデータのアドレス * スプライトパターン1枚につき128byteのデータ movem.l d0/a0/a1,-(sp) movea.l #sp_pattern,a1 lsl.l #7,d0 * d0の値を128倍にする adda.l d0,a1 moveq.l #0,d0 set_sprite_1: move.l (a0)+,(a1)+ addq.w #1,d0 cmp.w #32,d0 blt set_sprite_1 movem.l (sp)+,d0/a0/a1 rts put_sprite: * d0.w = 表示するスプライトの番号(0 - 127) * d1.w = %000000XXXXXXXXXX * X座標 * d2.w = %000000YYYYYYYYYY * Y座標 * d3.w = %VH00_CCCC_SSSSSSSS * V=上下反転 / H=左右反転 / C=パレット番号 / S=スプライトパターン番号 * d4.w = %00000000000000PP * PP : 00=表示OFF / 01=BG0>BG1>SP / 10=BG0>SP>BG1 / 11=SP>BG0>BG1 movem.l d0/a0,-(sp) movea.l #sp_controll,a0 ext.l d0 * d0の値をワードからロングワードに拡張する lsl.l #3,d0 * d0の値を8倍にする adda.l d0,a0 * スプライト情報を書き込んでスプライトを表示する move.w d1,(a0)+ move.w d2,(a0)+ move.w d3,(a0)+ move.w d4,(a0)+ movem.l (sp)+,d0/a0 rts * End Of File ------------------------------------------------------------------------------------------------ ファイルの保存が終わったらコマンドプロンプトから、 A>AS SP_SAMP.s [Enter] A>LK SP_SAMP.o [Enter} A>SP_SAMP.x [Enter] 上(↑)のように入力すると画面の中央にスプライトが表示されます。 もっとキャラクターらしい画像を用意できれば良かったのですが ドット絵の才能がないのでこういうスプライトパターンになりました(^^; 【スプライトの説明】 X680x0(Z)のスプライトは16x16pxサイズのパターンを同時に128枚表示する事が可能です。 スプライトパターンデータはアドレス$EB8000から32KBの空間で 128バイトのパターンを256枚用意する事ができます。 スプライト用のパレットはアドレス$E82200から始まり 1パレットあたり32バイト(16色)で パレット0からパレット15までの16本で512Bytes用意されています。 パレット0はテキスト画面のパレットと共用なので注意が必要です。 128枚のスプライトはそれぞれ個別に2枚のBG画面の手前/間/奥から奥行表示位置を選ぶ事ができます。 スプライトのパターンデータの構造は、 左右に別れた2枚の8x16pxの4ビット画像が 連続した形でパターンデータ領域に配置されるようにして下さい。 スプライトを表示する時の座標値はXとYそれぞれ16ずつ足さないと 画面からはみ出して画面に映りません。 [EOF]